import matplotlib.pyplot as plt
from pymysql import Connect

def plt_dim_in():
    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
    conn = Connect(host='localhost', port=3306, user='root', password='123456', database='sakila_dwh_2', charset='utf8')
    cur = conn.cursor()
    sql = "select store_name,count(store_key) from fact_rental fr left join dim_store ds on fr.store_key=ds.index group by store_name"
    cur.execute(sql)
    date = cur.fetchall()
    x = []
    y = []
    for i in date:
        x.append(i[0])
        y.append(i[1])

    # 1.统计各门店的业务量（租赁笔数）（柱形图）
    # 创建一个点数为 8 x 6 的窗口, 并设置分辨率为 80像素/每英寸
    plt.figure(figsize=(8, 6), dpi=80)
    # 再创建一个规格为 1 x 1 的子图
    plt.subplot(1, 1, 1)
    plt.bar(x, y, width=0.5, edgecolor="white", linewidth=0.7, label="rainfall", color=['#87CEFA', 'r'])
    plt.ylabel('租贷笔数')
    plt.xlabel('门店')
    plt.title('各门店的业务量')
    # 添加图例
    # plt.legend(loc="upper right")
    for i in date:
        plt.text(i[0], i[1], i[1], ha='center')
    # plt.show()

    # 2.统计各职员的营业总额（柱形图+饼图）
    sql = """SELECT dim_staff.first_name,round(SUM(amount),2) as xfze
    FROM fact_rental left JOIN dim_staff  on (dim_staff.index=fact_rental.staff_key)
    GROUP BY dim_staff.first_name
    ORDER BY xfze DESC"""
    cur.execute(sql)
    date = cur.fetchall()
    x = []
    y = []
    for i in date:
        x.append(i[0])
        y.append(i[1])
    # 柱状图
    # 创建一个点数为 8 x 6 的窗口, 并设置分辨率为 80像素/每英寸
    plt.figure(figsize=(8, 6), dpi=80)
    # 再创建一个规格为 1 x 1 的子图
    plt.subplot(1, 1, 1)
    plt.bar(x, y, width=0.5, edgecolor="white", linewidth=0.7, label="rainfall", color=['#87CEFA', 'r', 'b', 'g', 'm'])
    plt.ylabel('总额度')
    plt.xlabel('职员名称')
    plt.title('各职员的销售总额')
    # 添加图例
    plt.legend(loc="upper right", labels=['Jack', 'Jon', 'Mike', 'Rose', 'Tom'])
    for i in date:
        plt.text(i[0], i[1], i[1], ha='center')
    # plt.show()

    # 饼状图
    # 创建一个点数为 8 x 6 的窗口, 并设置分辨率为 80像素/每英寸
    plt.figure(figsize=(8, 6), dpi=80)
    # 再创建一个规格为 1 x 1 的子图
    plt.subplot(1, 1, 1)
    plt.pie(y, labels=x,
            autopct='%.1f%%',  # 显示百分比
            pctdistance=0.8,
            labeldistance=1.1,
            startangle=180,
            shadow=True,  # 显示阴影
            explode=[0.02, 0.05, 0.03, 0.04, 0.05],  # 板块之间的宽度
            textprops={'fontsize': 10, 'color': 'black'},
            wedgeprops={'linewidth': 1, 'edgecolor': 'black'})  # 设置边框大小与颜色
    plt.title('各职员的销售总额度—占比情况')
    # plt.show()

    # 3.各语种电影的创收总额（柱形图+饼图）
    sql = """SELECT dim_film.name,round(sum(amount),2)  as '销售总额'
    FROM fact_rental left join dim_film ON (fact_rental.film_key=dim_film.index)
    GROUP BY dim_film.name"""
    cur.execute(sql)
    date = cur.fetchall()
    x = []
    y = []
    for i in date:
        x.append(i[0])
        y.append(i[1])
    # print(x,y)
    plt.figure(figsize=(8, 6), dpi=80)
    # 再创建一个规格为 1 x 1 的子图
    plt.subplot(1, 1, 1)
    plt.bar(x, y, width=0.5, edgecolor="white", linewidth=0.7, label="rainfall", color=['#87CEFA', 'r', 'b', 'g', 'm', 'y'])
    plt.ylabel('总额度')
    plt.xlabel('电影语种类型')
    plt.title('各语种电影的创收总额')
    # 添加图例
    # plt.legend(loc="upper right",labels=['Jack','Jon','Mike','Rose','Tom'])
    for i in date:
        plt.text(i[0], i[1], i[1], ha='center')
    # plt.show()

    # 饼状图
    # 创建一个点数为 8 x 6 的窗口, 并设置分辨率为 80像素/每英寸
    plt.figure(figsize=(8, 6), dpi=80)
    # 再创建一个规格为 1 x 1 的子图
    plt.subplot(1, 1, 1)
    plt.pie(y, labels=x,
            autopct='%.1f%%',  # 显示百分比
            pctdistance=0.8,
            labeldistance=1.1,
            startangle=180,
            shadow=True,  # 显示阴影
            explode=[0.02, 0.05, 0.03, 0.04, 0.05, 0.06],  # 板块之间的宽度
            textprops={'fontsize': 10, 'color': 'black'},
            wedgeprops={'linewidth': 1, 'edgecolor': 'black'})  # 设置边框大小与颜色
    plt.title('各语种电影的创收总额—占比情况')
    # plt.show()

    # 4.各国家客户的消费总额（前十）（柱形图）
    sql = """SELECT dim_customer.country,round(SUM(amount),2) as xfze
    FROM fact_rental left JOIN dim_customer on (dim_customer.index=fact_rental.customer_key)
    GROUP BY dim_customer.country
    ORDER BY xfze DESC
    LIMIT 10
    """
    cur.execute(sql)
    date = cur.fetchall()
    x = []
    y = []
    for i in date:
        x.append(i[0])
        y.append(i[1])
    # # 创建一个点数为 8 x 6 的窗口, 并设置分辨率为 80像素/每英寸
    plt.figure(figsize=(15, 10), dpi=80)
    # 再创建一个规格为 1 x 1 的子图
    plt.subplot(1, 1, 1)
    plt.bar(x, y, width=0.5, edgecolor="white", linewidth=0.7, label="rainfall", color=['#87CEFA', 'r', 'b', 'g', 'm', 'y'])
    plt.ylabel('总额度')
    plt.xlabel('国家名称')
    plt.title('各国家客户的消费总额')
    for i in date:
        plt.text(i[0], i[1], i[1], ha='center')
    # plt.show()

    # 5.创收前十的客户的消费总额（柱形图）
    sql = """SELECT dim_customer.first_name,round(SUM(amount),2) as xfze 
    FROM fact_rental left JOIN dim_customer on (dim_customer.index=fact_rental.customer_key) 
    GROUP BY dim_customer.first_name 
    ORDER BY xfze DESC
    LIMIT 10
    """
    cur.execute(sql)
    date = cur.fetchall()
    x = []
    y = []
    for i in date:
        x.append(i[0])
        y.append(i[1])
    # # 创建一个点数为 8 x 6 的窗口, 并设置分辨率为 80像素/每英寸
    plt.figure(figsize=(15, 10), dpi=80)
    # 再创建一个规格为 1 x 1 的子图
    plt.subplot(1, 1, 1)
    plt.bar(x, y, width=0.5, edgecolor="white", linewidth=0.7, label="rainfall", color=['#87CEFA', 'r', 'b', 'g', 'm', 'y'])
    plt.ylabel('总额度')
    plt.xlabel('客户名称')
    plt.title('创收前十的客户的消费总额')
    for i in date:
        plt.text(i[0], i[1], i[1], ha='center')

    plt.show()

    print('已完成数据可视化')
